(function () {
  'use strict';

  var samplesMono;

  var floatTo16BitPCM = function (input, output) {
    for (var i = 0; i < input.length; i++) {
      var s = Math.max(-1, Math.min(1, input[i]));
      output[i] = (s < 0 ? s * 0x8000 : s * 0x7FFF);
    }
  };

  var convertBuffer = function (arrayBuffer) {
    var data = new Float32Array(arrayBuffer);
    var out = new Int16Array(arrayBuffer.length);
    floatTo16BitPCM(data, out);
    return out;
  };

  var encode = function (arrayBuffer) {
    samplesMono = convertBuffer(arrayBuffer);
    self.postMessage({
      cmd: 'pcm',
      buf: samplesMono
    });
  };

  self.onmessage = function (e) {
    switch (e.data.cmd) {
      case 'encode':
        encode(e.data.buf);
        break;
    }
  };
})();
